arcdps\extras\message/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! Message information provided by Unofficial Extras.

mod npc;
mod squad;

pub use self::{npc::*, squad::*};

#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

#[cfg(feature = "strum")]
use strum::{Display, EnumCount, EnumIter, IntoStaticStr, VariantNames};

/// A chat message.
#[derive(Clone, Copy)]
#[repr(C)]
pub union RawMessage {
    squad: *const SquadMessage,
    npc: *const NpcMessage,
}

/// A chat message.
#[derive(Debug, Clone)]
pub enum Message<'a> {
    Squad(&'a SquadMessage),
    Npc(&'a NpcMessage),
}

impl Message<'_> {
    /// Creates a new message from [`RawMessageType`] and [`RawMessage`].
    #[inline]
    pub unsafe fn new(message_type: MessageType, message: RawMessage) -> Self {
        match message_type {
            MessageType::Squad => Self::Squad(
                message
                    .squad
                    .as_ref()
                    .expect("invalid unofficial extras squad message info"),
            ),
            MessageType::Npc => Self::Npc(
                message
                    .npc
                    .as_ref()
                    .expect("invalid unofficial extras npc message info"),
            ),
        }
    }
}

/// Type of message.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(
    feature = "strum",
    derive(Display, EnumCount, EnumIter, IntoStaticStr, VariantNames)
)]
#[repr(C)]
pub enum MessageType {
    /// Party or squad chat message.
    Squad = 0,

    /// NPC message (selectable in ingame-chat as "NPC").
    Npc = 1,
}